Componet 的生命週期
Component 的三大生命週期
生命週期就是指一個 React Component 在被創建到被銷毀的過程中,會經歷的一系列階段。
一. Mount
Mount 流程會在 component 以 React component 的形式第一次出現在畫面上時觸發。
render phase:
- React 會執行 component function 以傳入的 props 和 state 產生初始畫面區塊的 react element。
- 此時 React 內部會建立 fiber node 以儲存 component 的實例,這個 component 實例會包含 component 畫面結構、state、side effect...等。
- 接著將生成的 react element 交到 commit phase 處理。
commit phase:
- 由於此時是第一次 render,瀏覽器實際的 DOM 中並沒有相對應的 component 實例 DOM element,因此會將 react element 全部轉成相對應的實際 DOM element。
- 使用瀏覽器的 DOM API
appendChild()
將生成的 DOM element 掛載到實際的瀏覽器 DOM 上。 - 此時 component 就會被掛載到瀏覽器的畫面上,可以在實際的 DOM Element 中找到相對應的實例的 DOM element。
執行 side effect:
執行 useEffect hook 中的 副作用。
二. Update
Update 流程會在 component 存在於畫面中,當 component 的 props 或 state 資料發生變化時觸發 re-render。在 react 中能夠觸發 re-render 的手段就是使用 setState
去更新 state 資料,而 component 有可能會因為父層或祖父層的 component setState
去更新 state 而傳入新的 props 而觸發 re-render;也有可能因為 component 本身 state 更新了而觸發 re-render。
render phase:
- React 會執行 component function 以新版本傳入的 props 和 state 重新產生 react element。
- 接著將新版本所產生的 react element 與上一次 render 的舊版 react element 進行樹狀結構的比較,找出差異。
- 將差異的部分交到 commit phase 處理。
commit phase:
只會去操作新舊 react element 差異所對應的實際 DOM element。
清除前一次 render 的 side effect:
執行前一次 useEffect hook 中定義的清除副作用 cleanup 函式。
執行本次 render 的 side effect
三. Unmount
當 component 在 re-render 後在新畫面中被移除時,就會觸發 unmount 流程。
- 會先將 component 從瀏覽器的實際 DOM element 中移除。
- 接著會執行最後一次 useEffect hook 中副作用中的 cleanup 函式,以清除留下的副作用影響。
- 移除 React 內部的 fiber node。